package javaCode.chapter16.homework;

/**
 * @author 徐州城
 * @version 1.0
 * 编程题
 * 1. 有两个用户分别从同一个卡上取钱 (总额：10000)
 * 2. 每次都取1000，当余额不足时，就不能取款了
 * 3. 不能出现超取现象 -> 线程同步问题
 */
public class Homework02 {
    public static void main(String[] args) {

        new T().start();//第一个线程
        new T().start();//第二个线程

    }
}

//编程取款的线程
class T extends Thread {
    static int money = 10000;//余额
    static Object object = new Object();

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(250);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //解读
            //1. 这里使用 synchronized 实现了线程同步
            //2. 当多个线程执行到这里，就会争夺 object对象锁
            //3. 哪个线程争夺到(获取) 到object对象锁，就执行 synchronized 代码块，执行完后，会释放 object对象锁
            //4. 争夺不到object对象锁，就 Blocked，准备继续争夺
            //5. object对象锁是非公平锁
            synchronized (object) {//同步代码块
                if (money < 1000){
                    System.out.println("余额不足");
                    break;
                }
                money -= 1000;

                System.out.println(Thread.currentThread().getName() + " 取出1000 还剩 " + money);
            }
        }
    }
}
